package queue;

/**
 * 队列：先进先出
 * 使用数组实现队列
 */
public class MyArrayQueue {

    /**
     * 数据
     */
    String[] data;

    /**
     * 头部元素下标
     */
    int head;

    /**
     * 尾部元素下标
     */
    int tail;

    /**
     * 元素个数
     */
    int size;

    /**
     * 初始化数组容量
     */
    public MyArrayQueue(int cap) {
        data = new String[cap];
    }


    /**
     * 入队 如果队列已满，返回 false
     */
    public boolean offer(String e){
        //判断队列是否已满
        if(size == data.length){
          return false;
        }
        data[tail] = e;
        tail++;
        //如果 tail 的值 等于 data.length
        //说明 tail 需要被重置
        //进行取模也是一样的  tail = tail % data.length;
//        if(tail == data.length){
//            tail = 0;
//        }
        tail = tail % data.length;
        size++;
        return true;
    }

    /**
     * 出队,当队列为空时,返回 null
     */
    public String poll(){

        //判断队列是否已空
        if(isEmpty()){
            return null;
        }
        String value = data[head];
        data[head] = null;
        head++;
        //如果 head 的值 等于 data.length
        //说明 head 需要被重置
        //进行取模也是一样的  head = head % data.length;
//        if(head == data.length){
//            head = 0;
//        }
        head = head % data.length;
        size--;
        return value;
    }

    /**
     * 获得队列头部元素，如果队列为空，则返回null
     */
    public String peek(){
        if(isEmpty()){
            return null;
        }
        return data[head];
    }

    /**
     * 队列是否已空
     */
    public boolean isEmpty(){
        //也可以使用 head == tail
        return size == 0;
    }

    /**
     * 打印数据
     */
    public void print() {
        if (isEmpty()) {
            System.out.println("队列为空");
            return;
        }
        System.out.print("队列元素为：");
        for (int i = 0; i < data.length; i++) {
            System.out.print(data[i] +" ");
        }
        System.out.println();
    }

    public static void main(String[] args) {
        MyArrayQueue myQueue = new MyArrayQueue(4);
        System.out.println("获得头元素："+myQueue.peek());
        System.out.println("插入元素：" +myQueue.offer("a"));
        System.out.println("插入元素：" +myQueue.offer("b"));
        System.out.println("插入元素：" +myQueue.offer("c"));
        System.out.println("插入元素：" +myQueue.offer("d"));
        System.out.println("插入元素：" +myQueue.offer("e"));

        System.out.println("获得头元素："+myQueue.peek());
        myQueue.print();

        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("插入元素：" +myQueue.offer("a2"));
        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("插入元素：" +myQueue.offer("c2"));
        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("插入元素：" +myQueue.offer("d2"));
        System.out.println("移除元素：" + myQueue.poll() + " 第一次插入的 a、b、c、d 移除完毕");
        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("获得头元素："+myQueue.peek());

        System.out.println("插入元素：" +myQueue.offer("a"));
        System.out.println("插入元素：" +myQueue.offer("b"));
        System.out.println("插入元素：" +myQueue.offer("c"));
        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("移除元素：" + myQueue.poll());
        System.out.println("移除元素：" + myQueue.poll());
    }
}
